﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Evolution
{
    class Program //Класс точка входа в программу
    {
        static void Main(string[] args)
        {
            Cells Grid = new Cells();
            Console.Title = "Task #2 Evolution";
            Console.WindowHeight = 34;
            Console.WriteLine("Press enter to begin");
            Console.ReadLine();
            Console.Clear();
            Grid.Print();
            Console.WriteLine("Press spacebar to continue or another key to exit");
            while (Console.ReadKey().KeyChar == ' ')
            {
                Console.Clear();
                Grid.Change();
                Grid.Print();
                Console.WriteLine("Press spacebar to continue or another key to exit");
            }
            Console.Clear();
            Console.WriteLine("End of run.");
            Console.ReadLine();
        }
    }

    class Cells //Класс обрабатывающий таблицу ячеек
    {
        byte[,] Mas = new byte[32, 32];
        public Cells()   //Заполняем матрицу 30х30 случайными значениями
        {
            Random gener = new Random();
            for (int i = 0; i < 32; i++)  //Создаем рамку во избежание выхода за пределы индексов
            {
                Mas[0, i] = 2;
                Mas[i, 0] = 2;
                Mas[i, 31] = 2;
                Mas[31, i] = 2;
            }
            for (int i = 1; i < 31; i++)
                for (int j = 1; j < 31; j++)
                    Mas[i, j] = (byte)gener.Next(2);
        }
        public void Print() //Выводим матрицу на экран
        {
            for (int i = 1; i < 31; i++)
            {
                for (int j = 1; j < 31; j++)
                    if (Mas[i, j] == 0)
                        Console.Write(' ');
                    else
                        Console.Write('*');
                Console.WriteLine();
            }
        }
        public void Change() //Шаг эволюции
        {
            byte count0 = 0;
            byte count1 = 0;
            byte[,] Temp = new byte[32, 32];
            Array.Copy(Mas, Temp, Temp.Length);
            for (int i = 1; i < 31; i++)
                for (int j = 1; j < 31; j++)
                {
                    Around(i, j, ref count0, ref count1);
                    if ((Mas[i, j] == 0) && (count1 >= 2)) Temp[i, j] = 1;
                    else if ((Mas[i, j] == 1) && (count0 == 0)) Temp[i, j] = 0;
                }
            Array.Copy(Temp, Mas, Mas.Length);
        }
        private void Around(int n, int m, ref byte count0, ref byte count1) //Подсчитываем ячейки окружающие данную
        {
            count0 = 0;
            count1 = 0;
            for (int i = n - 1; i <= n + 1; i++)
                for (int j = m - 1; j <= m + 1; j++)
                    if ((i != n) || (j != m))
                    {
                        if (Mas[i, j] == 1) count1++;
                        else if (Mas[i, j] == 0) count0++;
                    }
        }
    }
}
